package br.leiam.eolica.util;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.Connection;
import java.sql.Statement;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Scanner;
import java.util.StringTokenizer;

/**
 * 
 * <b>HelpDeskTRE</b><br>
 * <br>
 * 
 * 
 * Classe que representa uma conexao que faz o read e write de arquivos txt
 * 
 * 
 * @author Arthur Lucio Meneses Farias <br>
 * @author Andre Luiz Alves <br>
 * @author Danilo Coura Moreira <br>
 */
public class ConexaoTXT implements Conexao {

	private String fileName;// Nome do arquivo para leitura e gravacao
	private Connection conexao;
	private Statement stmt;

	/**
	 * Contrutor da classe
	 * 
	 * @param filename
	 *            o nome do arquivo
	 */
	public ConexaoTXT(String filename) {
		this.setFileName(filename);
	}

	/**
	 * Realiza a gravacao dem um Object afim de se obter a persistencia dele, a
	 * gravacao eh feita em um arquivo .txt
	 * 
	 * @param obj
	 *            o Object que sera gravado
	 */
	public void write(Object obj) {
		try {// construct an OutputStreamWriter on a FileOutputStream.
			grava((String) obj, false);
		} catch (IOException e) {
			System.out.println("Erro ao tentar gravar o arquivo.");
		}
	}

	public void write(Object obj, String string) {
		try {// construct an OutputStreamWriter on a FileOutputStream.
			FileWriter fw = new FileWriter(string, false);
			fw.write((String) obj);
			fw.flush();
			fw.close();
		} catch (IOException e) {
			System.out.println("Erro ao tentar gravar o arquivo.");
		}
	}
	
	

	public void writeAtTheEndOfFile(Object obj) {
		try {// construct an OutputStreamWriter on a FileOutputStream.
			grava((String) obj, true);
		} catch (IOException e) {
			System.out.println("Erro ao tentar gravar o arquivo.");
		}
	}

	/**
	 * Metodo privado para gravar no arquivo uma String
	 * 
	 * @param string
	 *            a String a ser gravada
	 * @throws IOException
	 *             se houver algum erro com o arquivo
	 */
	private void grava(String string, boolean append) throws IOException {
		FileWriter fw = new FileWriter(getFileName(), append);
		fw.write(string);
		fw.flush();
		fw.close();
	}

	/**
	 * Le um Object de um arquivo .txt
	 * 
	 * @return O Object lido, ou null se nao for encontrado
	 */
	public Object read() {
		try {
			FileReader fw = new FileReader(getFileName());
			Scanner sc = new Scanner(fw);
			String relatorio = "";
			while (sc.hasNextLine()) {
				relatorio += sc.nextLine() + "\n";
			}

			fw.close();
			return relatorio;
		} catch (IOException e) {
		}
		return null;
	}
	
	public void lerECospeLog(LinkedList excluidos) {
		try {
			FileReader fw = new FileReader(getFileName());
			Scanner sc = new Scanner(fw);	
			HashSet set = new HashSet();
			while (sc.hasNextLine()) {
				String trim = "";	
				String out = "";
				trim = sc.nextLine();
				if (trim.contains("Atividade:")) {
					StringTokenizer tokenizer = new StringTokenizer(trim);
					tokenizer.nextToken();tokenizer.nextToken();tokenizer.nextToken();
					String sh = tokenizer.nextToken();
					if(!excluidos.contains(sh)){
						out = trim;
						out += "\n\t" + sc.nextLine().trim();
						out += "\n\t" + sc.nextLine().trim() + "\n";					
						set.add(sh);
						System.out.println(out);
					}
				}
				
			}
			fw.close();
			if(set.size() > 0){
				System.out.println(set.size()+" Registros alterados");
				System.out.println(set);
			}else{
				System.out.println("Nenhum registro encontrado");
			}
			
		} catch (IOException e) {
		}
	}

	public Object readSkippingFirstLine() {
		try {
			FileReader fw = new FileReader(getFileName());
			Scanner sc = new Scanner(fw);
			String relatorio = "";
			if (sc.hasNextLine())
				sc.nextLine();
			while (sc.hasNextLine()) {
				relatorio += sc.nextLine() + "\n";
			}
			fw.close();
			return relatorio;
		} catch (IOException e) {
		}
		return null;
	}

	public Object readFirstLine() {
		try {
			FileReader fw = new FileReader(getFileName());
			Scanner sc = new Scanner(fw);
			String relatorio = "";
			if (sc.hasNextLine()) {
				relatorio = sc.nextLine();
			}
			fw.close();
			return relatorio;
		} catch (IOException e) {
		}
		return null;
	}

	public void setFileName(String fileName) {
		this.fileName = fileName;
	}

	public String getFileName() {
		return fileName;
	}

	public Object readLine(int lineNumber) {
		try {
			FileReader fw = new FileReader(getFileName());
			Scanner sc = new Scanner(fw);
			String relatorio = "";
			for (int i = 0; i < lineNumber - 1; i++) {
				if (sc.hasNextLine())
					sc.nextLine();
			}
			relatorio = sc.nextLine();
			fw.close();
			return relatorio;
		} catch (IOException e) {
		}
		return null;
	}

	

}
